home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr49 / 119_01.zip / FORMAT91.ASM < prev    next >
Assembly Source File  |  1993-06-16  |  8KB  |  257 lines

  1. ; DISK FORMATTING PROGRAM
  2. ; WRITTEN BY DICK CULBERTSON IN AUG, 1977
  3. ; MODIFIED BY DON TARBELL IN SEP, 1977
  4. ; MODIFIED BY MARC FARJEON - MAY 24, 1979.
  5. ;
  6. ; THE PURPOSE OF THIS PROGRAM IS TO FORMAT
  7. ; OR REFORMAT A DISK ON DRIVE A.  THIS MAY BE REQUIRED
  8. ; IF A NEW DISK IS NOT FORMATTED CORRECTLY,
  9. ; OR IF AN OLD ONE IS CRASHED.
  10. ; BE CAREFULL,  THIS PROGRAM WIPES OUT
  11. ; ANY INFORMATION YOU MAY HAVE HAD
  12. ; ON THE DISK.  ALSO BE SURE THAT YOU HAVE
  13. ;CHANGED C4 FROM 1000PF TO .1MFD PERMENANTLY.
  14. ;
  15. DCOM      EQU  0F8H        ;DISK COMMAND PORT
  16. DSTAT     EQU  0F8H        ;DISK STATUS PORT
  17. TRACK     EQU  0F9H        ;DISK TRACK COMMAND
  18. SECTP     EQU  0FAH        ;DISK SECTOR PORT
  19. DDATA     EQU  0FBH        ;DISK DATA PORT
  20. WAIT      EQU  0FCH        ;DISK WAIT CONTROL PORT
  21. ENTRY      EQU  5       ;ENTRY PT TO FDOS
  22.           ORG  0100H       ;LOAD & EX HERE
  23.  
  24. ;STARTING MESSAGE
  25.     
  26.     MVI C,9        ;GET CODE FOR PRINT.
  27.     LXI D,MSG    ;GET ADR OF MESSAGE.
  28.     CALL ENTRY    ;PRINT OPENING.
  29. BGIN:    MVI C,9
  30.     LXI  D,RDY    ;PRINT READY MESSAGE.
  31.     CALL ENTRY
  32.     MVI C,1        ;READ A CHAR FROM KB.
  33.     CALL ENTRY
  34.     CPI 'Y'        ;IF IT'S A 'Y',
  35.     RNZ
  36.     JMP  START    ;GO AHEAD AND DO IT.
  37. MSG:     DB 'INITIALIZATION ROUTINE FOR FLOPPIES'
  38.     DB    13,10,'FORMAT91 '
  39.     DB 0DH,0AH,0AH
  40.     DB 'BY DICK CULBERTSON'
  41.     DB 0DH,0AH,'AUG, 1977 $'
  42. RDY:    DB 0DH,0AH,'BLANK DISK READY TO FORMAT? (Y,N) $'
  43.  
  44. ;
  45. ; RESTORE DRIVE TO TRACK 00
  46. ;
  47. START:    MVI  A,0B2H    ;SET PERSCI
  48.     OUT  WAIT    ;RESTORE LINE.
  49.     MVI  A,3    ;LOAD HOME CMD.
  50.           OUT  DCOM        ;ISSUE HOME CMD
  51.       IN WAIT        ;WAIT FOR HOME
  52.     MVI  A,0F2H    ;RESET RESTORE LINE.
  53.     OUT  WAIT
  54.           MVI  C,0         ;SET TRACK NUMBER TO 0
  55.           MVI  H,77        ;SET TOTAL TRACKS TO 77
  56. NXTTRK    MVI  D,1         ;SECTOR CNT TO 0
  57.           MVI  E,26        ;SET MAX # SECTORS -1 
  58.           MVI  B,40        ;GAP 4 PREINDEX 40 BYTES OF FF
  59.           MVI  A,0F4H      ;LOAD TRACK WRITE COMMAND
  60.           OUT  DCOM        ;ISSUE TRACK WRITE
  61. ; WRITE PREINDEX FILL
  62. PREIND    IN   WAIT        ;WAIT FOR DRQ
  63.           ORA  A           ;SET FLAGS
  64.           JP   ERRMSG      ;JMP OUT IF ERROR
  65.           MVI A,0FFH           ;LOAD PREINDEX FILL
  66.           OUT  DDATA       ;WRITE IT ON DISK
  67.           DCR  B           ;COUNT =COUNT - 1
  68.           JNZ  PREIND      ;GO BACK TILL B =0
  69.     MVI    B,6
  70. PREIN1:    IN    WAIT
  71.     ORA    A
  72.     JP    ERRMSG
  73.     XRA    A
  74.     OUT    DDATA
  75.     DCR    B
  76.     JNZ    PREIN1
  77.  
  78. ;
  79. ; WRITE ADDRESS MARK ON TRACK
  80. ;
  81.           IN   WAIT        ;WAIT FOR DRQ
  82.           ORA  A           ;SET FLAGS
  83.           JP   ERRMSG      ;JMP OUT IF ERROR
  84.           MVI  A,0FCH      ;LOAD ADDRESS MARK
  85.           OUT  DDATA       ;WRITE IT ON DISK
  86. ;
  87. ; POST INDEX GAP
  88. ;
  89.           MVI  B,26        ;SET # OF BYTES
  90. POSTID    IN   WAIT        ;WAIT FOR DRQ
  91.           ORA  A           ;SET FLAGS
  92.           JP  ERRMSG       ;JMP OUT IF ERROR
  93.           MVI  A,0FFH      ;LOAD FILL DATA
  94.           OUT  DDATA       ;WRITE IT ON DISK
  95.           DCR  B           ;COUNT = COUNT - 1
  96.           JNZ  POSTID      ;IF NOT 0 GO BACK
  97. ;
  98. ; PRE ID SECTION
  99. ;
  100. ASECT     MVI  B,6         ;GET # OF BYTES
  101. SECTOR    IN   WAIT        ;WAIT FOR DRQ
  102.           ORA  A           ;SET FLAGS
  103.           JP   ERRMSG      ;JMP OUT IF ERROR
  104.           XRA  A           ;MAKE A = 0
  105.           OUT  DDATA       ;WRITE IT ON TRACK
  106.           DCR  B           ;COUNT = COUNT=1
  107.           JNZ  SECTOR      ;JMP BACK IF NOT DONE
  108. ;
  109. ; WRITE ID ADDRESS MARK
  110. ;
  111.           IN   WAIT        ;WAIT FOR DRQ
  112.           ORA  A           ;SET FLAGS
  113.           JP   ERRMSG      ;IF ERROR JMP OUT
  114.           MVI  A,0FEH      ;GET ADDRESS MARK
  115.           OUT  DDATA       ;WRITE IT ON DISK
  116. ;
  117. ; WRITE TRACK NUMBER ON DISK
  118. ;
  119.           IN   WAIT        ;WAIT FOR DRQ
  120.           ORA  A           ;SET FLAGS
  121.           JP   ERRMSG      ;JMP OUT IF ERROR
  122.           MOV  A,C         ;GET TRACK NUMBER
  123.           OUT  DDATA       ;WRITE IT ON DISK
  124. ;
  125. ; WRITE ONE BYTE OF 00
  126. ;
  127.           IN   WAIT        ;WAIT FOR DRQ
  128.           ORA  A           ;SET FLAGS
  129.           JP   ERRMSG      ;JMP OUT IF ERROR
  130.           XRA  A           ;SET A TO 0
  131.           OUT DDATA        ;WRITE IT ON DISK
  132. ;
  133. ; WRITE SECTOR # ON DISK
  134. ;
  135.           IN   WAIT        ;WAIT FOR DRQ
  136.           ORA  A           ;SET FLAGS
  137.           JP   ERRMSG      ;JMP OUT IF ERROR
  138.           MOV  A,D         ;GET SECTOR #
  139.           OUT DDATA        ;WRITE IT ON DISK
  140. ;
  141. ; ONE MORE BYTE 0
  142. ;
  143.           IN   WAIT        ;WAIT FOR DRQ
  144.           ORA  A           ;SET FLAGS
  145.           JP   ERRMSG      ;JMP OUT IF ERROR
  146.           XRA  A           ;SET A TO 00
  147.           OUT  DDATA       ;WRITE IT ON DISK
  148.           INR  D           ;BUMP SECT. #
  149. ;
  150. ; WRITE 2 CRC'S ON THIS SECTOR
  151. ;
  152.           IN   WAIT        ;WAIT FOR DRQ
  153.           ORA  A           ;SET FLAGS
  154.           JP   ERRMSG      ;JMP OUT IF ERROR
  155.           MVI  A,0F7H      ;GET CRC PATTERN
  156.           OUT DDATA        ;WRITE IT ON DISK
  157. ;
  158. ; PRE DATA 17 BYTES 00
  159. ;
  160.           MVI  B,11        ;SET COUNT
  161. PREDAT    IN   WAIT        ;WAIT FOR DRQ
  162.           ORA  A           ;SET FLAGS
  163.           JP   ERRMSG      ;JMP OUT IF ERROR
  164.           MVI  A,0FFH           ;SET A TO 00
  165.           OUT  DDATA       ;WRITE IT ON DISK
  166.           DCR  B           ;REDUCE COUNT BY 1
  167.           JNZ  PREDAT      ;GO BACK IF NOT DONE
  168.     MVI  B,6
  169. PREDA1:    IN   WAIT
  170.     ORA  A
  171.     JP   ERRMSG
  172.     XRA  A
  173.     OUT  DDATA
  174.     DCR  B
  175.     JNZ  PREDA1
  176.  
  177. ;
  178. ; DATA ADDRESS MARK
  179. ;
  180.           IN   WAIT        ;WAIT FOR DRQ
  181.           ORA  A           ;SET FLAGS
  182.           JP   ERRMSG      ;JMP OUT IF ERROR
  183.           MVI  A,0FBH      ;GET DATA ADDRESS MARK
  184.           OUT  DDATA       ;WRITE IT ON DISK
  185. ;
  186. ; FILL DATA FIELD WITH E5
  187. ;
  188.           MVI  B,128       ;SET FIELD LENGTH
  189. DFILL     IN   WAIT        ;WAIT FOR DRQ
  190.           ORA  A           ;YOU KNOW WHAT
  191.           JP   ERRMSG      ;HAPPENS HERE BY NOW
  192.           MVI  A,0E5H      ;GET FILL BYTE
  193.           OUT  DDATA       ;WRITE IT ON DISK
  194.           DCR  B           ;DROP 1 FROM COUNT
  195.           JNZ  DFILL       ;DO TILL 00
  196. ;
  197. ; WRITE CRC'S
  198. ;
  199.           IN   WAIT        ;WAIT TILL DRQ
  200.           ORA  A           ;SET FLAGS
  201.           JP   ERRMSG      ;JMP OUT IF ERROR
  202.           MVI  A,0F7H      ;GET CRC BYTE
  203.           OUT  DDATA       ;WRITE IT ON DISK
  204. ;
  205. ; END OF SECTOR FILL
  206. ;
  207.       DCR  E       ;REDUCE SECTOR COUNT
  208.       JZ  ENDTRK       ;IF 0 DO END OF TRACK RTN
  209. DATGAP    IN WAIT          ;WAIT FOR DRQ
  210.           ORA  A           ;SET FLAGS   
  211.           JP   ERRMSG      ;JMP OUT IF ERROR
  212.       MVI  A,0FFH       ;GET FILL CHARACTER
  213.           OUT  DDATA       ;WRITE IT ON DISK
  214.       JMP  POSTID-2    ;GO BACK FOR MORE
  215. ;
  216. ; DO TRACK & SECTOR HOUSE KEEPING
  217. ;
  218. ENDTRK    IN   WAIT        ;WAIT FOR DRQ OR INTRQ
  219.           ORA  A           ;SET FLAGS
  220.           JP   DONE        ;JMP OUT IF ERROR
  221.       MVI  A,0FFH       ;LOAD A WITH FFH
  222.           OUT  DDATA       ;WRITE IT ON DISK
  223.           JMP  ENDTRK      ;DO UNTIL INTRQ
  224. ;
  225. ; ERROR SORT ROUTINE
  226. ;
  227. DONE      IN   DSTAT       ;READ STATUS
  228.           ANI  0FFH        ;TEST FOR FLAG
  229.       JNZ  ERRMSG       ;IF ERR GO TO ERR PRINT RTN
  230.           INR  C           ;BUMP TRACK #
  231.           DCR  H           ;TRK COUNT =COUNT -1
  232.           JNZ  BMPTRK      ;IF NOT 0 THEN DO MORE
  233.       JMP  BGIN       ;GO BACK TO DO ROUTINE AGAIN
  234.  
  235. BMPTRK    MVI  A,53H       ;LOAD STEP IN
  236.           OUT  DCOM        ;STEP IN
  237.       IN  WAIT         ;WAIT TIL DONE
  238.       ORA A            ;SET FLAGS
  239.       IN   WAIT       ;WAIT FOR DRQ
  240.       IN   DSTAT       ;CHECK STATUS
  241.       PUSH H       ;SAVE H&L
  242.       MVI  A,1       ;GET PERSCI STEP CMD
  243.       OUT  WAIT       ;STEP IT
  244.       LXI  H,0FFFH       ;SET DELAY COUNT
  245. LOOP1      DCX  H       ;COUNT IT DOWN
  246.       MOV  A,H       ;LOAD H FOR TEST
  247.       ORA  L       ;TEST IT
  248.       JNZ  LOOP1       ;GO BACK IF NOT DONE
  249.       POP  H       ;RESTORE H
  250.       JMP  NXTTRK
  251. ;
  252. ;ERROR ROUTINE
  253. ;
  254. ERRMSG      STA 0000H
  255.       HLT
  256.           
  257.